package com.itcoon.cloud.framework.mybatis.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.itcoon.cloud.framework.mybatis.core.Page;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface XBaseMapper<T> extends BaseMapper<T>, MPJBaseMapper<T> {

    default LambdaQueryChainWrapper<T> queryChain() {
        return new LambdaQueryChainWrapper<>(this);
    }

    default LambdaUpdateChainWrapper<T> updateChain() {
        return new LambdaUpdateChainWrapper<>(this);
    }


    boolean removeRealById(Serializable id);


    int removeRealByIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> ids);


    /**
     * 批量插入 仅适用于mysql
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(Collection<T> entityList);

    /**
     * 根据 ID 查询数据项，包括逻辑删除数据项
     * @param id ID
     * @return 结果数据项
     */
    T getRealById(Serializable id);

    /**
     * 查询数据项列表，包括逻辑删除数据项
     * @return 结果数据项列表
     */
    List<T> listReal();

    Page<T> pageReal(IPage<T> page);

    /**
     * 根据 ID 查询数据项列表，包括逻辑删除数据项
     * @param ids ID 列表
     * @return 结果数据项列表
     */
    List<T> listRealByIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> ids);

    List<T> listRealLike(String s);
}